Модуль:Инвентарный слот
--- Модуль для отображения инвентарных слотов в Minecraft Wiki. ------------------------------------------------------------------- local p = {} -- Список приставок к названиям, обрабатываемых другими модулями. -- Так будет легче, например, убирать их из целей ссылок. -- ВНИМАНИЕ: указывайте все варианты склонения по родам и числам. p.prefixes = { 'Любой', 'Любая', 'Любое', 'Любые', 'Повреждённый', 'Повреждённая', 'Повреждённое', 'Повреждённые' -- использование Ё обязательно } p.modAliases = mw.loadData("Модуль:Модификации") --- Создание слота function p.slot(f) --- Получение аргументов local args = f.args or f if f mw.getCurrentFrame() and args1 nil then args = f:getParent().args end -- Первый аргумент args1 = mw.text.trim(args1 or '') --- Псевдонимы оригинальной игры local aliases = mw.loadData('Модуль:Инвентарный слот/Псевдонимы') --- Проверка и замена всех фреймов на псевдонимы local frames = {} for frame in mw.text.gsplit( args1, '%s*;%s*' ) do local frameParts = p.getParts( frame, args"мод" ) local id = frameParts.name -- if frameParts.mod then -- id = frameParts.mod .. ':' .. id -- end --- Загрузка списка псевдонимов к модам local modAliases if frameParts.mod then if mw.title.new('Модуль:ИнвСпрайт/' .. frameParts.mod).exists then modAliases = mw.loadData('Модуль:ИнвСпрайт/' .. frameParts.mod)"модпсевдонимы" if modAliases and mw.title.new('Модуль:' .. modAliases).exists then modAliases = mw.loadData('Модуль:' .. modAliases) end end end local alias = nil if frameParts.mod then if modAliases and modAliasesid then --- псевдонимы следует прописывать в модуле в формате 'имя' = 'титл:имятекст', титл и доп.текст необязательно указывать local title = mw.ustring.match ( modAliasesid, '^%[(^%]+)%]' ) if title then local aaa = mw.ustring.match ( modAliasesid, '^%^%+%](.+)$' ) if aaa then alias = '.. title .. '' .. frameParts.mod .. ':' .. aaa else alias = '.. title .. '' .. frameParts.mod .. ':' .. frameParts.name end else alias = frameParts.mod .. ':' .. modAliasesid end end elseif aliases and aliasesid then alias = aliasesid end if alias then table.insert( frames, p.expandAlias( frameParts, alias ) ) else table.insert( frames, frame ) end end args1 = table.concat( frames, ';' ) --- Проверка и замена всех фреймов на псевдонимы (конец) --- Построение спрайта -- Параметры local sprite local ids = mw.loadData(Модуль:ИнвСпрайт/ID)"IDы" local modIds = {} local back_modIds = {} local animated = mw.ustring.find(args1, ';') local pageName = mw.title.getCurrentTitle().text local imgClass = args"классизобр" local numStyle = args"стильцифр" local body = mw.html.create('span'):css{'vertical-align' = args"выравн"} if animated then body:addClass('animated') end if args"класс" then body:addClass(args"класс") end body:addClass('invslot') if args"стиль" then body:cssText(args"стиль") end if (args"умолчание" or '') ~= '' then body:css('background-image', ' ') end ---спрайты для фона if (args"умолчаниеCSS" or '') ~= '' then local mod=args"мод" if mod then local back_modData = back_modIdsmod if not back_modData and mw.title.new('Модуль:ФоновыйСпрайт/' .. mod .. '/ID').exists then back_modData = mw.loadData('Модуль:ФоновыйСпрайт/' .. mod .. '/ID') back_modIdsmod = back_modData end if back_modData then param = mw.loadData('Модуль:ФоновыйСпрайт/' .. mod) local n = args"умолчаниеCSS" if not back_modDatan and string.find( n, 'fluid' ) then n = 'no_fluid_pic' end if back_modDatan or '' ~= '' then local pos = back_modDatan - 1 local size = param"разм" local tiles = param"формат" / size local left = pos % tiles * size local top = math.floor( pos / tiles ) * size body:css('background-image', ' ') body:css('background-size', 'auto') body:css('background-position', '-' .. left .. 'px -' .. top ..'px') end end end end --- Обработка фреймов local first = true for frame in mw.text.gsplit(args1, '%s*;%s*') do local item if frame ~= '' or frame '' and animated then item = body:tag('span'):addClass('invslot-item') if imgClass then item:addClass(imgClass) end end if frame '' then (item or body):tag('br') else local category local parts = p.getParts(frame, args"мод") local title = parts.title or mw.text.trim(args"назв" or '') local mod = parts.mod local name = parts.name local num = parts.num local description = parts.text --- Добавляем к доп тексту название мода local img, idData, en_name if mod then local modData = modIdsmod if not modData and mw.title.new('Модуль:ИнвСпрайт/' .. mod .. '/ID').exists then modData = mw.loadData('Модуль:ИнвСпрайт/' .. mod .. '/ID')"IDы" modIdsmod = modData end if modData and modDataname then idData = modDataname en_name = idData"en" else img = name .. ' (' .. mod .. ')' end elseif idsname then idData = idsname else img = name end local link = args"ссылка" or '' if link '' then if mod then link = mod .. '/' .. name else link = mw.ustring.gsub(name, '^Повреждённыаойяе ', '') end elseif mw.ustring.lower(link) 'нет' then link = nil end if link pageName then link = nil end local formattedTitle local plainTitle if title '' then plainTitle = name elseif mw.ustring.lower(title) ~= 'нет' then plainTitle = mw.ustring.gsub(mw.ustring.gsub(title, '\\\\', '\'), '\\&', '&') local formatPattern = '&0-9a-fk-or' if mw.ustring.match(plainTitle, formatPattern) then formattedTitle = title plainTitle = mw.ustring.gsub(plainTitle, formatPattern, '') end if plainTitle '' then plainTitle = name else plainTitle = mw.ustring.gsub(mw.ustring.gsub(plainTitle, '\', '\\'), '&', '&') end elseif link then if img then formattedTitle = '' else plainTitle = '' end end item:attr{ 'data-minetip-title' = formattedTitle, 'data-minetip-text' = description, 'data-modinfo-text' = mod, 'data-minetip-lowtitle' = en_name } if img then -- & is re-escaped because mw.html treats attributes -- as plain text, but MediaWiki doesn't local escapedTitle = ( plainTitle or '' ):gsub( '&', '&' ) item:addClass('invslot-item-image') :wikitext('32x32px|link=', link or '', '|', escapedTitle, '') else if not sprite then sprite = require(Модуль:Спрайт).sprite end local image if mod then image = (args"таблспрайтов" or mod or "Inv") .. 'CSS.png' end if link then item:wikitext('[link, '|') end local image, spriteCat; if not mod then image, spriteCat = sprite{ ["данныеID" = idData, "назв" = plainTitle, "изобр" = image, "настройки" = 'ИнвСпрайт' } else image, spriteCat = sprite{ "данныеID" = idData, "назв" = plainTitle, "изобр" = image, "настройки" = 'ИнвСпрайт/' .. mod } end item:node(image) category = spriteCat end if num and num > 1 and num < 1000 then if img and link then item:wikitext('') end local number = item :tag('span') :addClass('invslot-stacksize') :attr{title = plainTitle} :wikitext(num) if numStyle then number:cssText(numStyle) end if img and link then item:wikitext('') end end if idData and link then item:wikitext(']]') end item:wikitext(category) end if first then if animated and item then item:addClass('active') end first = false end end return tostring( body ) end function p.expandAlias( frameParts, alias ) -- If the frame has no parts, we can just return the alias as-is --if not frameParts.title and not frameParts.mod and not frameParts.num and not frameParts.text then return alias end-- local expandedFrames = {} for aliasFrame in mw.text.gsplit(alias, '%s*;%s*') do local aliasParts = p.getParts(aliasFrame) aliasParts.title = frameParts.title or aliasParts.title or '' aliasParts.mod = frameParts.mod or aliasParts.mod or 'Minecraft' aliasParts.num = frameParts.num or aliasParts.num or '' aliasParts.text = frameParts.text or aliasParts.text or '' table.insert(expandedFrames, mw.ustring.format( '%s%s:%s,%s%s', aliasParts.title, aliasParts.mod, aliasParts.name, aliasParts.num, aliasParts.text )) end return table.concat(expandedFrames, ';') end function p.getParts(frame, mod) ----Функция получает название предмета в формате "титлмод:имядоп.текст,число" ----parts.title = титл, название предмета при наведении ----parts.mod = мод ----parts.name = имя ----parts.text = текст, дополнительный текст при наведении на предмет ----parts.num = число local parts = {} parts.title = mw.ustring.match(frame, '^%[%s*(^%]+)%s*%]') local modPattern if mw.ustring.match(frame, '^%.*%(_%-\'+):') then modPattern = '^%.*%(_%-\'+):' else modPattern = '^(_%-\'+):' end parts.mod = mw.text.trim(mw.ustring.match(frame, modPattern) or mod or '') ---- Получаем название мода local vanilla = {v = 1, vanilla = 1, mc = 1, minecraft = 1} if parts.mod '' or vanillamw.ustring.lower(parts.mod) then parts.mod = nil else if p.modAliasesparts.mod then parts.mod = p.modAliasesparts.mod end parts.mod = mw.ustring.gsub(parts.mod,'_',' ') end local _, nameStartV = mw.ustring.find( frame, '^%^%*%]' ) local nameStart = ( ({mw.ustring.find( frame, modPattern )})2 or nameStartV or 0 ) + 1 if nameStart - 1 #frame then nameStart = 1 end parts.name = mw.text.trim( mw.ustring.sub( frame, nameStart, ( mw.ustring.find( frame, '[,%[]', nameStart ) or 0 ) - 1 ) ) parts.num = math.floor(mw.ustring.match(frame, ',%s*(%d+)') or 0) if parts.num 0 then parts.num = nil end parts.text = mw.ustring.match(frame, '%[%s*(^%]+)%s*%]$') return parts end return p